/* 660. Read N Characters Given Read4 II - Call multiple times
接口：int read4(char * buf)一次从文件中读取 4 个字符。
返回值是实际读取的字符数。 例如，如果文件中只剩下 3 个字符，则返回 3。
通过使用read4 接口，实现从文件读取 n 个字符的函数int read(char * buf，int n)。

注意事项
read 函数可能被调用多次。 */




// Forward declaration of the read4 API.
int read4(char *buf);



class Solution {
public:
    /**
     * @param buf destination buffer
     * @param n maximum number of characters to read
     * @return the number of characters read
     */
    // v1
    // char now[4];
    // int cur_pos;
    // int total_pos;
    // int read(char *buf, int n) {
    //     // Write your code here
    //     for (int i = 0; i < n; i++)
    //     {
    //         if (cur_pos == total_pos)
    //         {
    //             total_pos = read4(now);
    //             cur_pos = 0;
    //         }
    //         if (cur_pos < total_pos)
    //         {
    //             buf[i] = now[cur_pos++];
    //         }
    //         else
    //         {
    //             return i;
    //         }
    //     }
    //     return n;
    // }
    
    
    
    // v2: queue
    char now[5];
    char tmp[5];
    int read(char *buf, int n)
    {
        int i = 0;
        for (; i < n; i++)
        {
            if (strlen(now) == 0)
            {
                if (read4(now) == 0)
                {
                    break;
                }
            }
            buf[i] = now[0];
            // copy(begin(now) + 1, end(now), begin(tmp));
            memcpy(tmp, now + 1, strlen(now) - 1); 
            memcpy(now, tmp, 4);
            memset(tmp, 0, 4);
        }
        return i;
    }
    
};